package top.zhangjianyong.blog.config.web;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * WebMvc 配置类
 * 配置异步执行器，解决 SimpleAsyncTaskExecutor 警告
 *
 * @author zhangjianyong
 * @since 2025/1/5
 */
@Slf4j
@Configuration
@EnableAsync
public class WebMvcConfig implements WebMvcConfigurer {

  /**
   * 配置异步执行器
   * 使用自定义的线程池替代默认的 SimpleAsyncTaskExecutor
   */
  @Override
  public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    log.info("配置 WebMvc 异步执行器");
    // 设置异步请求超时时间（毫秒）
    configurer.setDefaultTimeout(30000);
    // 设置异步执行器
    configurer.setTaskExecutor(asyncTaskExecutor());
  }

  /**
   * 创建异步任务执行器
   * 使用自定义的线程池，避免使用 SimpleAsyncTaskExecutor
   */
  private ThreadPoolTaskExecutor asyncTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    // 配置核心线程数
    executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
    // 配置最大线程数
    executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 2);
    // 配置队列大小
    executor.setQueueCapacity(100);
    // 配置线程池中的线程的名称前缀
    executor.setThreadNamePrefix("async-web-mvc-");
    // 配置拒绝策略：由调用线程执行
    executor.setRejectedExecutionHandler(new java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy());
    // 执行初始化
    executor.initialize();
    return executor;
  }
} 